home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (PO)
/
Nibble Volume 11, No. 11 (1990-11)(MindCraft Publishing)(Side A).zip
/
Nibble Volume 11, No. 11 (1990-11)(MindCraft Publishing)(Side A).po
/
LIFE.SRC.CODE.txt
< prev
next >
Wrap
Text File
|
1996-12-24
|
28KB
|
653 lines
*****************************************************************
* LIFE GS Source Code *
* *
* By Timothy // Shay ORCA/M GS Assembler *
* *
* Copyright 1990 MindCraft Publishing Corporation *
*****************************************************************
KEEP LIFE ;Output filename: LIFE
MCOPY LIFE.MAC ;Macro filename: LIFE.MAC
LIFE START ;Assembly begins here
PHK ;Environment: Data Bank
PLB ; equals Code Bank
*****************************************************************
* WakeUp - Start up all the necessary tools *
*****************************************************************
WAKEUP _TLSTARTUP ;Start Tool Locator
PEA 0 ;Start Memory Manager
_MMSTARTUP
JSR ERRORS ;Check for errors
PLA ;Keep our UserID
STA USERID
_MTSTARTUP ;Start Misc Tools
JSR ERRORS ;Check for errors
PEA 0 ;Get direct pages
PEA 0 ; for toolbox use
PEA 0
PEA $500 ;5 pages
LDA USERID ;Our ID
PHA
PEA $C005 ;Locked, fixed, aligned,
PEA 0 ; fixed address in
PEA 0 ; Bank 00
_NEWHANDLE
JSR ERRORS ;Check for errors
PLA ;De-reference our handle
STA 0
STA HANDLE
PLA
STA 2
STA HANDLE+2
LDA [0] ;Get our direct page
STA DPAGES ; address and keep it
PHA ;Start Quickdraw/DP addr
PEA 0 ;320 mode
PEA 0 ;Default pixel map size
LDA USERID ;Our ID
PHA
_QDSTARTUP
_INITCURSOR
JSR ERRORS ;Check for errors
LDA DPAGES ;Start Event Manager
CLC
ADC #$300
PHA ;DP address
PEA 20 ;Event queue size
PEA 0 ;Minimum X for mouse
PEA 320 ;Maximum X for mouse
PEA 0 ;Minimum Y for mouse
PEA 200 ;Maximum Y for mouse
LDA USERID
PHA ;Our ID
_EMSTARTUP
JSR ERRORS ;Check for errors
TOOLOAD PEA $1B ;Load Font Manager
PEA 0 ;Any version
_LOADONETOOL
BCC FMSTART
JSR ERRORS ;Check for errors
CMP #$DE01 ;Recoverable disk error?
BEQ TOOLOAD ;Yes, try loading again
JMP FIN1 ;No, we're through
FMSTART LDA USERID ;Start Font Manager
PHA ;Our ID
LDA DPAGES
CLC
ADC #$400
PHA ;DP address
_FMSTARTUP
JSR ERRORS ;Check for errors
*****************************************************************
* Set rectangles, Initialize game screen and variables *
*****************************************************************
SETRX STZ TRSHV1 ;Start at Cell #0
SETRX1 LDA TRSHV1 ;Have we done the last
CMP #512 ; cell?
BEQ INIT ;Yes, proceed to Init
ASL A ;No, multiply by 8
ASL A ; to get the offset into
ASL A ; the CellRex rectangle
CLC ; data area and push it
ADC #CELLREX ; to the stack
PEA CELLREX|-16
PHA
LDA TRSHV1 ;Minimum X for this
AND #%11111 ; rectangle is
ASL A ;(Cell-Int(Cell/32))*8+32
ASL A
ASL A
STA TRSHV2
CLC
ADC #32
PHA ;Push X-min to the stack
LDA TRSHV1 ;Minimum Y for this
AND #%111100000 ; rectangle is
LSR A ; (Int(Cell/32))*8+24
LSR A
CLC
ADC #24
PHA ;Push Y-min to the stack
LDA TRSHV2 ;Maximum X for this
CLC ; rectangle is
ADC #39 ;(Cell-Int(Cell/32))*8+39
PHA ;Push X-max to the stack
LDA TRSHV1 ;Maximum Y for this
AND #%111100000 ; rectangle is
LSR A ; (Int(Cell/16))*8+31
LSR A
CLC
ADC #31
PHA ;Push Y-max to the stack
_SETRECT ;SetRect
INC TRSHV1 ;Do the next cell
BRA SETRX1
INIT PEA 0 ;Change color table 0
POINT COLORS ; to our color table
_SETCOLORTABLE
PEA $EEEE ;Clear screen to Grey
_CLEARSCREEN
PEA 1 ;Pen = Dk Grey
_SETSOLIDPENPAT
STZ TRSHV1
INIT1 LDY TRSHV1 ;Get the offset into the
LDA DKPTS,Y ; coordinate table for
PHA ; dark lines
LDA DKPTS+2,Y
PHA ;Move the pen to the
_MOVETO ; first point found in
LDY TRSHV1 ; the table
LDA DKPTS+4,Y
PHA
LDA DKPTS+6,Y
PHA ;Draw a line to the next
_LINETO ; point
LDY TRSHV1
LDA DKPTS+8,Y
PHA
LDA DKPTS+10,Y
PHA ;And another line to the
_LINETO ; next point
LDA TRSHV1 ;Reset the offset for
CLC ; another three points
ADC #12
STA TRSHV1
CMP #276 ;Have we done them all?
BEQ INIT2 ;Yes, on to Init2
CMP #144 ;Finished the first set?
BNE INIT1 ;No, back to Init1
PEA 15 ;Pen = Lt Grey
_SETSOLIDPENPAT
BRA INIT1 ;Do the rest
INIT2 PEA 12 ;Pen= Lt Grey (two Lt
_SETSOLIDPENPAT ; Greys in the pallette)
PEA $0E00 ;Install Venice Font
PEA $0005
PEA 1 ;No scaling
_INSTALLFONT
JSR ERRORS ;Check for errors
CMP #$DE01 ;Use System Font if we
BEQ INIT2 ; can't find Venice Font
INIT3 PEA 4 ;Text mode = foreCOPY
_SETTEXTMODE
PEA 9 ;Text = Blue
_SETFORECOLOR
PEA 129 ;Start title at
PEA 17 ; X = 129 and Y = 17
_MOVETO
POINT TITLE ;Draw title once for
_DRAWSTRING ; blue highlighting
PEA 13 ;Text = Red
_SETFORECOLOR
PEA 128 ;Start title at
PEA 16 ; X = 128 and Y = 16
_MOVETO
POINT TITLE ;Draw title
_DRAWSTRING
_LOADSYSFONT ;Return to system font
LDA #HIMSG1 ;Send Opening message
LDX #HIMSG2
JSR MSG
JSR GETMK ;Wait for mouse-down
INIT4 STZ GENCT ;Zero generation count
LDA #QSRMSG ;Send Quit/Start/Restart
JSR MSG1 ; message
LDA #1 ;All cells are alive
LDX #1022
INIT5 STA NEWPIC,X
STZ OLDPIC,X
DEX
DEX
BPL INIT5
JSR FIXPIC ;Update the screen
LDA #1 ;All cells are vacant
LDX #1022
INIT6 STA OLDPIC,X
STZ NEWPIC,X
DEX
DEX
BPL INIT6
*****************************************************************
* Selections, Generations, and Evaluations *
*****************************************************************
SELECT JSR FIXPIC ;Update the screen
LDA #SELMSG1 ;Send Selection message
LDX #SELMSG2
JSR MSG
SELECT1 JSR GETMK ;Get a valid event
BCS SELECT1
LDA MKRTN
CMP #1024 ;Quit selected?
BNE SELECT2 ;No, go on
JMP FIN ;Yes, jump to Fin
SELECT2 CMP #1028 ;Restart selected?
BNE SELECT3 ;No, go on
JMP INIT4 ;Yes, back to Init4
SELECT3 CMP #1026 ;Start selected?
BEQ BEGIN ;Yes, on to Begin
SELECT4 LDX MKRTN ;A cell was selected
LDA OLDPIC,X
BNE SELECT5 ;It's alive, do Select5
LDA #1 ;Vacant, make it alive
STA NEWPIC,X
BRA SELECT ;Get another selection
SELECT5 STZ NEWPIC,X ;De-select this cell and
BRA SELECT ; get another selection
BEGIN LDA #GENMSG3 ;Start was selected
JSR MSG1 ;Show new options
LDA LIVCT
STA LIVST
GEN PEA CELLREX|-16 ;Invert chosen option
LDA MKRTN2
CLC
ADC #CELLREX
PHA
_INVERTRECT
GENER LDX #1022 ;Starting at Cell #511
GENER1 STZ TRSHV1 ;Zero NeighborCt
CPX #64 ;Top row?
BCC GENER4 ;Yes, skip top checks
LDA OLDPIC-64,X ;Check top neighbor
BEQ GENER2
INC TRSHV1 ;Alive, +1 to NeighborCt
GENER2 TXA
AND #$3E ;Left column?
BEQ GENER3 ;Yes, skip top left check
LDA OLDPIC-66,X ;Check top left neighbor
BEQ GENER3
INC TRSHV1 ;Alive, +1 to NeighborCt
GENER3 TXA
AND #$3E
CMP #$3E ;Right column?
BEQ GENER4 ;Yes, skip top right ck
LDA OLDPIC-62,X ;Check top right neighbor
BEQ GENER4
INC TRSHV1 ;Alive, +1 to NeighborCt
GENER4 TXA
AND #$3E ;Left column?
BEQ GENER5 ;Yes, skip left check
LDA OLDPIC-2,X ;Check left neighbor
BEQ GENER5
INC TRSHV1 ;Alive, +1 to NeighborCt
GENER5 TXA
AND #$3E
CMP #$3E ;Right column?
BEQ GENER6 ;Yes, skip right ck
LDA OLDPIC+2,X ;Check right neighbor
BEQ GENER6
INC TRSHV1 ;Alive, +1 to NeighborCt
GENER6 CPX #960 ;Bottom row?
BCS GENER9 ;Yes, skip bottom checks
LDA OLDPIC+64,X ;Check bottom neighbor
BEQ GENER7
INC TRSHV1 ;Alive, +1 to NeighborCt
GENER7 TXA
AND #$3E ;Left column?
BEQ GENER8 ;Yes, skip btm left check
LDA OLDPIC+62,X ;Check bottom left
BEQ GENER8 ;neighbor
INC TRSHV1 ;Alive, +1 to NeighborCt
GENER8 TXA
AND #$3E
CMP #$3E ;Right column?
BEQ GENER9 ;Yes, skip btm right ck
LDA OLDPIC+66,X ;Check btm right neighbor
BEQ GENER9
INC TRSHV1 ;Alive, + to NeighborCt
GENER9 LDA OLDPIC,X ;Current cell alive?
BEQ GENERA ;No, do GenerA
LDA TRSHV1 ;Alive with two
CMP #2
BEQ GENERC ; or three live
CMP #3 ; neighbors, do GenerC to
BEQ GENERC ; stay alive
BRA GENERB ;Otherwise, do GenerB
GENERA LDA TRSHV1 ;Vacant with three live
CMP #3 ; neighbors, do GenerC to
BEQ GENERC ; come alive
GENERB STZ NEWPIC,X ;Cell will not be alive
BRA GENERD ; in the new generation
GENERC LDA #1 ;Cell will be alive in
STA NEWPIC,X ; the new generation
GENERD DEX ;Go on to the next cell
DEX
BMI GENERE ;Last cell done, go on
JMP GENER1 ;More cells, go back
GENERE INC GENCT ;Update the screen
JSR FIXPIC ;Add one to GenerationCt
LDA #GENMSG1 ;Send Generation message
LDX #BLNKMSG
JSR MSG
PEA CELLREX|-16 ;Re-invert option
LDA MKRTN2 ; selected to return
CLC ; it to normal
ADC #CELLREX
PHA
_INVERTRECT
LDA LIVCT ;If no cells are alive,
BEQ ENDGM ; go to EndGame
LDA MKRTN ;Continuous selected?
CMP #1028
BNE GENERF ;No, go on with GenX1
PEA 0 ;Mouse still down?
PEA 0
_STILLDOWN
PLA
BEQ GENERF ;Button came up, GenX1
JMP GEN ;Still down, generate!
GENERF JSR GETMK ;Get a valid event
BCS GENERF
LDA MKRTN ;Determine which
CMP #1024 ; selection was made
BCC GENERF
BEQ ENDGM ;Stop, proceed to EndGame
JMP GEN ;Gen/Contin, generate
ENDGM LDA #BLNKMSG ;No options shown
JSR MSG1
PEA 0 ;For success rate, use
PEA 0 ; LiveCount times 100
LDA LIVCT ; divided by LiveStart
PHA
PEA 100
_MULTIPLY
PLA
PLX
PEA 0
PEA 0
PHA
LDA LIVST
PHA
_UDIVIDE
PLA ;Change success rate
STA TRSHV2 ; into a string value
PLX ; in Success message
PHA
PEA SCCMSG1|-16
PEA SCCMSG1+12
PEA 4
PEA 0
_INT2DEC
LDX #SCCMSG7 ;Zero percent, line
LDA TRSHV2 ; two is Success message
BEQ ENDGM1 ; seven
LDX #SCCMSG6 ;1-69 percent, line
CMP #70 ; two is Success message
BCC ENDGM1 ; six
LDX #SCCMSG5 ;70-129 percent, line
CMP #130 ; two is Success message
BCC ENDGM1 ; five
LDX #SCCMSG4 ;130-249 percent, line
CMP #250 ; two is Success message
BCC ENDGM1 ; four
LDX #SCCMSG3 ;200-499 percent, line
CMP #500 ; two is Success message
BCC ENDGM1 ; three
LDX #SCCMSG2 ;Otherwise, it's Success
ENDGM1 LDA #SCCMSG1 ; message two
JSR MSG
JSR GETMK ;Get any event
JMP INIT4 ; and restart the game
*****************************************************************
* FixPic & SLG-UpD fixes screen and updates counts *
*****************************************************************
FIXPIC PEA 1024 ;Starting at Cell #511
FIXPIC1 PLY ;Are we through?
BEQ SLGUPD ;Yes, do SLG
DEY ;Set the current offset
DEY ; and push it
PHY ; to the stack
TYA
AND #$3E ;Left column?
BNE FIXPIC2
STA $E0C030 ;Yes, click the speaker
FIXPIC2 LDA NEWPIC,Y ;NewPic different from
CMP OLDPIC,Y ; OldPic?
BEQ FIXPIC1 ;No, do next cell
STA OLDPIC,Y
TYA ;Yes, multiply cell
ASL A ; offset by 4 for
ASL A ; rectangle offset
STA TRSHV1
POINT LIVINFO ;Pixel parms for live
LDA NEWPIC,Y ;If the cell is vacant,
BNE FIXPIC3
PLA ; take it back and give
PEA VACINFO ; the one for vacancies
FIXPIC3 POINT PIXLREC ;BoundsRect for PIXELS
LDY TRSHV1
LDA CELLREX+2,Y ;The current cell's
PHA ; starting coordinates
LDA CELLREX,Y
PHA
PEA 0
_PPTOPORT ;Draw the cell and
BRA FIXPIC1 ; go back for another
SLGUPD STZ LIVCT ;Add up the live cells
LDY #1022
SLGUPD1 LDA NEWPIC,Y
BEQ SLGUPD2
INC LIVCT
SLGUPD2 DEY
DEY
BPL SLGUPD1
LDA LIVCT
PHA ;Change LivCt to an Ascii
PEA SELMSG2|-16 ; string in Selection
PEA SELMSG2+16 ; message two
PEA 3
PEA 0
_INT2DEC
LDA GENCT ;Change Generation Count
PHA ; to an Ascii string in
PEA GENMSG1|-16
PEA GENMSG1+14 ; Generation message one
PEA 4
PEA 0
_INT2DEC
LDY #2 ;Move LivCt string into
SLGUPD3 LDA SELMSG2+16,Y ; Selection message two
STA GENMSG1+20,Y ; and GenDone message one
DEY
BPL SLGUPD3
RTS
*****************************************************************
* Screen Message Processing Routine *
*****************************************************************
MSG PEA MSG|-16
PHA
PEA MSG|-16
PHX
PEA 9 ;Text = Blue
_SETFORECOLOR
POINT MSGSREC ;Clear top message box
_PAINTRECT
PEA 52 ;Send second string to
PEA 179 ; middle message line
_MOVETO
_DRAWSTRING
PEA 50 ;Send first string to
PEA 167 ; top message line
BRA MSG2 ;Jump down to Msg2
MSG1 PEA MSG|-16
PHA
PEA 2 ;Text = Dk Grey
_SETFORECOLOR
POINT QUITREC ;Clear quit box
_PAINTRECT
POINT STRTREC ;Clear start box
_PAINTRECT
POINT RESTREC ;Clear restart box
_PAINTRECT
PEA 56 ;Send string to bottom
PEA 194 ; message line
MSG2 _MOVETO
_DRAWSTRING
RTS
*****************************************************************
* Get mouse/keyboard events and evaluate them *
*****************************************************************
GETMK PHA ;Get an event
PEA $FFFF ;All events
POINT EVENT ;Location of event record
_GETNEXTEVENT
PLA
BEQ GETMK
GETMK2 LDA EVENT
CMP #1 ;Check for mouse event
BNE GETMK
PEA 4120 ;Mouse event, check if
GETMK3 PLA ; it was inside a game
BEQ GETMK4 ; system or box and set
SEC ; MKRtn accordingly
SBC #8
STA TRSHV1
PHA
PEA 0
POINT EVWHERE
PEA CELLREX|-16
LDA #CELLREX
CLC
ADC TRSHV1
PHA
_PTINRECT
PLA
BEQ GETMK3
PLA
STA MKRTN2
LSR A
LSR A
STA MKRTN
CLC ;Valid event, carry is
RTS ; clear on return
GETMK4 SEC ;Invalid event, carry
RTS ; is set on return
*****************************************************************
* Errors handled here free of charge *
*****************************************************************
ERRORS BCS ERRORS1 ;Did an error occur?
RTS ;No, we're done
ERRORS1 CMP #$45 ;Was it the wrong disk?
BNE CRASH
JSL $E100A8 ;GetBootVol
DC I2'$28',I4'BVPARM' ;Get the boot disk for
PHA ; tool set and font
PEA 20 ; loading
PEA 50
POINT PROMPT
POINT VOLNAME
POINT OK_MSG
POINT CNCLMS
_TLMOUNTVOLUME
PLA
CMP #1
BNE NODISK
LDA #$DE01
RTS
NODISK LDA #$DE00
RTS
CRASH PHA ;Major Malfunction,
POINT CRSHDAT ; display error message
_SYSFAILMGR ; and crash
*****************************************************************
* Fin - Shut down, quit, go home *
*****************************************************************
FIN _FMSHUTDOWN ;Shut down the tools
FIN1 _EMSHUTDOWN
_QDSHUTDOWN
_MTSHUTDOWN
LDA HANDLE+2 ;Give back our
PHA ; DP memory space
LDA HANDLE
PHA
_DISPOSEHANDLE
LDA USERID
PHA
_MMSHUTDOWN
_TLSHUTDOWN
JSL $E100A8 ;GSOS Quit
DC I2'$29',I4'FINDATA'
*****************************************************************
* Data Space - The Final Frontier *
*****************************************************************
BVPARM DC I4'VOLNAME'
PROMPT DC I1'13',C'Please Insert'
OK_MSG DC I1'4',C'Okay'
CNCLMS DC I1'5',C'Abort'
CRSHDAT DC H'27',C'Major Malfunction - Error: '
FINDATA DC 6H'00'
COLORS DC H'00005505550580009909EEEEEEEEEEEE'
DC H'EEEE0A00BF0F000ABB0B000FBB0BDD0D'
DKPTS DC I'124,19,124,2,194,2,125,18,125,3,193,3,30,152,30'
DC I'22,288,22,31,151,31,23,287,23,31,183,288,183'
DC I'288,155,32,182,287,182,287,156,31,197,117,197'
DC I'117,184,32,196,116,196,116,185,119,197,201,197'
DC I'201,184,120,196,200,196,200,185,203,197,288,197'
DC I'288,184,204,196,287,196,287,185,125,19,195,19'
DC I'195,2,126,18,194,18,194,3,31,152,288,152,288,23'
DC I'30,183,30,155,287,155,31,182,31,156,286,156,30'
DC I'197,30,184,116,184,31,196,31,185,115,185,118'
DC I'197,118,184,200,184,119,196,119,185,199,185,202'
DC I'197,202,184,287,184,203,196,203,185,286,185'
PIXLREC DC I'0,0,8,8'
LIVINFO DC I'0',I4'LIVCELL',I'4,0,0,8,8'
VACINFO DC I'0',I4'VACCELL',I'4,0,0,8,8'
LIVCELL DC H'1111111E14DDDD4E1DDADDBE1DADDDBE'
DC H'1DDDDBBE1DDDBBBE14BBBB4EEEEEEEEE'
VACCELL DC H'1111111E',6H'1444444E',H'EEEEEEEE'
TITLE DC I1'8',C'LIFE GS'
HIMSG1 DC I1'27',13H'20',C'Copyright 1990'
HIMSG2 DC I1'29',3H'20',C'MindCraft Publishing Corp.'
SELMSG1 DC I1'29',12H'20',C'Select Live Cells'
SELMSG2 DC I1'27',15H'20',C'000 Selected'
GENMSG1 DC I1'33',2H'20',C'Generation 0000, 000 Live Cells'
BLNKMSG DC I1'1',H'20'
SCCMSG1 DC I1'29',11H'20',C'0000% Success Rate'
SCCMSG2 DC I1'27',14H'20',C'Unbelievable!'
SCCMSG3 DC I1'28',16H'20',C'Outstanding!'
SCCMSG4 DC I1'28',19H'20',C'Good job!'
SCCMSG5 DC I1'30',11H'20',C'Holding your own...'
SCCMSG6 DC I1'29',16H'20',C'Not so hot...'
SCCMSG7 DC I1'30',7H'20',C'A losing proposition...'
QSRMSG DC I1'39',C'Quit',13H'20',C'Start',10H'20',C'Restart'
GENMSG3 DC I1'36',C'Done',10H'20',C'Generate',4H'20',C'Continuous'
USERID DS 2
HANDLE DS 4
DPAGES DS 2
VOLNAME DS 18
EVENT DS 10
EVWHERE DS 6
MKRTN DS 2
MKRTN2 DS 2
TRSHV1 DS 2
TRSHV2 DS 2
OLDPIC DS 1024
NEWPIC DS 1024
GENCT DS 2
LIVCT DS 2
LIVST DS 2
SCCRT DS 2
CELLREX DS 4096
QUITREC DC I'186,32,196,116'
STRTREC DC I'186,120,196,200'
RESTREC DC I'186,204,196,287'
MSGSREC DC I'157,32,182,287'
END